/**
 * echarts组件：图表标题
 *
 * @desc echarts基于Canvas，纯Javascript图表库，提供直观，生动，可交互，可个性化定制的数据统计图表。
 * @author Kener (@Kener-林峰, kener.linfeng@gmail.com)
 *
 */


var Base = require('./base');
// 图形依赖
var TextShape = require('zrender/shape/Text');
var RectangleShape = require('zrender/shape/Rectangle');
var ecConfig = require('../config');
// 图表标题
ecConfig.title = {
    zlevel: 0,
    // 一级层叠
    z: 6,
    // 二级层叠
    show: true,
    text: '',
    // link: null,             // 超链接跳转
    // target: null,           // 仅支持self | blank
    subtext: '',
    // sublink: null,          // 超链接跳转
    // subtarget: null,        // 仅支持self | blank
    x: 'left',
    // 水平安放位置，默认为左对齐，可选为：
    // 'center' ¦ 'left' ¦ 'right'
    // ¦ {number}（x坐标，单位px）
    y: 'top',
    // 垂直安放位置，默认为全图顶端，可选为：
    // 'top' ¦ 'bottom' ¦ 'center'
    // ¦ {number}（y坐标，单位px）
    //textAlign: null          // 水平对齐方式，默认根据x设置自动调整
    backgroundColor: 'rgba(0,0,0,0)',
    borderColor: '#ccc',
    // 标题边框颜色
    borderWidth: 0,
    // 标题边框线宽，单位px，默认为0（无边框）
    padding: 5,
    // 标题内边距，单位px，默认各方向内边距为5，
    // 接受数组分别设定上右下左边距，同css
    itemGap: 5,
    // 主副标题纵向间隔，单位px，默认为10，
    textStyle: {
        fontSize: 18,
        fontWeight: 'bolder',
        color: '#333'    // 主标题文字颜色
    },
    subtextStyle: {
        color: '#aaa'    // 副标题文字颜色
    }
};
var zrUtil = require('zrender/tool/util');
var zrArea = require('zrender/tool/area');
var zrColor = require('zrender/tool/color');
/**
     * 构造函数
     * @param {Object} messageCenter echart消息中心
     * @param {ZRender} zr zrender实例
     * @param {Object} option 图表参数
     */
function Title(ecTheme, messageCenter, zr, option, myChart) {
    Base.call(this, ecTheme, messageCenter, zr, option, myChart);
    this.refresh(option);
}
Title.prototype = {
    type: ecConfig.COMPONENT_TYPE_TITLE,
    _buildShape: function () {
        if (!this.titleOption.show) {
            return;
        }
        // 标题元素组的位置参数，通过计算所得x, y, width, height
        this._itemGroupLocation = this._getItemGroupLocation();
        this._buildBackground();
        this._buildItem();
        for (var i = 0, l = this.shapeList.length; i < l; i++) {
            this.zr.addShape(this.shapeList[i]);
        }
    },
    /**
         * 构建所有标题元素
         */
    _buildItem: function () {
        var text = this.titleOption.text;
        var link = this.titleOption.link;
        var target = this.titleOption.target;
        var subtext = this.titleOption.subtext;
        var sublink = this.titleOption.sublink;
        var subtarget = this.titleOption.subtarget;
        var font = this.getFont(this.titleOption.textStyle);
        var subfont = this.getFont(this.titleOption.subtextStyle);
        var x = this._itemGroupLocation.x;
        var y = this._itemGroupLocation.y;
        var width = this._itemGroupLocation.width;
        var height = this._itemGroupLocation.height;
        var textShape = {
            zlevel: this.getZlevelBase(),
            z: this.getZBase(),
            style: {
                y: y,
                color: this.titleOption.textStyle.color,
                text: text,
                textFont: font,
                textBaseline: 'top'
            },
            highlightStyle: {
                color: zrColor.lift(this.titleOption.textStyle.color, 1),
                brushType: 'fill'
            },
            hoverable: false
        };
        if (link) {
            textShape.hoverable = true;
            textShape.clickable = true;
            textShape.onclick = function () {
                if (!target || target != 'self') {
                    window.open(link);
                } else {
                    window.location = link;
                }
            };
        }
        var subtextShape = {
            zlevel: this.getZlevelBase(),
            z: this.getZBase(),
            style: {
                y: y + height,
                color: this.titleOption.subtextStyle.color,
                text: subtext,
                textFont: subfont,
                textBaseline: 'bottom'
            },
            highlightStyle: {
                color: zrColor.lift(this.titleOption.subtextStyle.color, 1),
                brushType: 'fill'
            },
            hoverable: false
        };
        if (sublink) {
            subtextShape.hoverable = true;
            subtextShape.clickable = true;
            subtextShape.onclick = function () {
                if (!subtarget || subtarget != 'self') {
                    window.open(sublink);
                } else {
                    window.location = sublink;
                }
            };
        }
        switch (this.titleOption.x) {
        case 'center':
            textShape.style.x = subtextShape.style.x = x + width / 2;
            textShape.style.textAlign = subtextShape.style.textAlign = 'center';
            break;
        case 'left':
            textShape.style.x = subtextShape.style.x = x;
            textShape.style.textAlign = subtextShape.style.textAlign = 'left';
            break;
        case 'right':
            textShape.style.x = subtextShape.style.x = x + width;
            textShape.style.textAlign = subtextShape.style.textAlign = 'right';
            break;
        default:
            x = this.titleOption.x - 0;
            x = isNaN(x) ? 0 : x;
            textShape.style.x = subtextShape.style.x = x;
            break;
        }
        if (this.titleOption.textAlign) {
            textShape.style.textAlign = subtextShape.style.textAlign = this.titleOption.textAlign;
        }
        this.shapeList.push(new TextShape(textShape));
        subtext !== '' && this.shapeList.push(new TextShape(subtextShape));
    },
    _buildBackground: function () {
        var padding = this.reformCssArray(this.titleOption.padding);
        this.shapeList.push(new RectangleShape({
            zlevel: this.getZlevelBase(),
            z: this.getZBase(),
            hoverable: false,
            style: {
                x: this._itemGroupLocation.x - padding[3],
                y: this._itemGroupLocation.y - padding[0],
                width: this._itemGroupLocation.width + padding[3] + padding[1],
                height: this._itemGroupLocation.height + padding[0] + padding[2],
                brushType: this.titleOption.borderWidth === 0 ? 'fill' : 'both',
                color: this.titleOption.backgroundColor,
                strokeColor: this.titleOption.borderColor,
                lineWidth: this.titleOption.borderWidth
            }
        }));
    },
    /**
         * 根据选项计算标题实体的位置坐标
         */
    _getItemGroupLocation: function () {
        var padding = this.reformCssArray(this.titleOption.padding);
        var text = this.titleOption.text;
        var subtext = this.titleOption.subtext;
        var font = this.getFont(this.titleOption.textStyle);
        var subfont = this.getFont(this.titleOption.subtextStyle);
        var totalWidth = Math.max(zrArea.getTextWidth(text, font), zrArea.getTextWidth(subtext, subfont));
        var totalHeight = zrArea.getTextHeight(text, font) + (subtext === '' ? 0 : this.titleOption.itemGap + zrArea.getTextHeight(subtext, subfont));
        var x;
        var zrWidth = this.zr.getWidth();
        switch (this.titleOption.x) {
        case 'center':
            x = Math.floor((zrWidth - totalWidth) / 2);
            break;
        case 'left':
            x = padding[3] + this.titleOption.borderWidth;
            break;
        case 'right':
            x = zrWidth - totalWidth - padding[1] - this.titleOption.borderWidth;
            break;
        default:
            x = this.titleOption.x - 0;
            x = isNaN(x) ? 0 : x;
            break;
        }
        var y;
        var zrHeight = this.zr.getHeight();
        switch (this.titleOption.y) {
        case 'top':
            y = padding[0] + this.titleOption.borderWidth;
            break;
        case 'bottom':
            y = zrHeight - totalHeight - padding[2] - this.titleOption.borderWidth;
            break;
        case 'center':
            y = Math.floor((zrHeight - totalHeight) / 2);
            break;
        default:
            y = this.titleOption.y - 0;
            y = isNaN(y) ? 0 : y;
            break;
        }
        return {
            x: x,
            y: y,
            width: totalWidth,
            height: totalHeight
        };
    },
    /**
         * 刷新
         */
    refresh: function (newOption) {
        if (newOption) {
            this.option = newOption;
            this.option.title = this.reformOption(this.option.title);
            this.titleOption = this.option.title;
            this.titleOption.textStyle = this.getTextStyle(this.titleOption.textStyle);
            this.titleOption.subtextStyle = this.getTextStyle(this.titleOption.subtextStyle);
        }
        this.clear();
        this._buildShape();
    }
};
zrUtil.inherits(Title, Base);
require('../component').define('title', Title);
module.exports = Title || module.exports;;